package com.um2.mauction.session.impl;

import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;

import javax.ejb.Remote;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import com.um2.mauction.session.remote.UserManagerRemote;
import com.um2.mauction.entity.Enchere;
import com.um2.mauction.entity.Utilisateur;
import com.um2.mauction.entity.Vente;

@Remote(UserManagerRemote.class)
@Stateless
public class UserManagerBean implements UserManagerRemote
{
	public static final String RemoteJNDIName =  UserManagerBean.class.getSimpleName() + "/remote";
	
	@PersistenceContext
	private EntityManager em;	
	
	/**
	 * Retourne l'utilisateur a partir de son identifiant
	 */
	public Utilisateur getUtilisateur(int idUser) 
	{
		return em.find(Utilisateur.class,idUser);		
	}

	/**
	 * Ajoute un utilisateur
	 */
	public void addUtilisateur(String login,String mdp,String nom,String prenom,String adresse,String email) 
	{
		em.persist(new Utilisateur(login,mdp,nom,prenom,adresse,email));		
	}
	
	public int addUtilisateur(Utilisateur u)
	{
		em.persist(u);
		return u.getId_user();
	}
	
	/**
	 * Met a jour un utilisateur
	 */
	public void updateUtilisateur(int idUser,String login,String mdp,String nom,String prenom,String adresse,String email) 
	{
		Utilisateur u = em.find(Utilisateur.class,idUser);
		u.setLogin(login);
		u.setMotDePasse(mdp);
		u.setNom(nom);
		u.setPrenom(prenom);
		u.setAdresse(adresse);
		u.setEmail(email);		
	}

	/**
	 * Supprime un utilisateur
	 */
	public void deleteUtilisateur(int idUser) 
	{
		Utilisateur u = em.find(Utilisateur.class,idUser);
		em.remove(u);
	}	
	
	/**
	 * Verifie le login et mot de passe d'un utilisateur
	 */
	@SuppressWarnings("unchecked")
	public Utilisateur check(String login,String mdp) 
	{		
		Collection<Utilisateur> users = new HashSet<Utilisateur>();
		
		users =	em.createQuery(	"SELECT u " +
								"FROM Utilisateur u " +
								"where login='" + login + "' and motdepasse='"+ mdp +"'").getResultList();
		Utilisateur u = null;
		for (Iterator<Utilisateur> iterator = users.iterator(); iterator.hasNext();) 
			u = iterator.next();				
		return u;		
	}

	/**
	 * Ajoute une enchere existante a un utilisateur existant
	 * @param idBid
	 * @param idUser
	 */
	public void addEnchereToUtilisateur(int idBid,int idUser) 
	{
		Enchere e = em.find(Enchere.class,idBid);
		Utilisateur u = em.find(Utilisateur.class,idUser);
		u.assignEnchere(e);		
	}

	/**
	 * Ajoute une vente existante a un utilisateur existant
	 * @param idSale
	 * @param idUser
	 */
	public void addVenteToUtilisateur(int idSale,int idUser) 
	{
		Vente v = em.find(Vente.class,idSale);
		Utilisateur u = em.find(Utilisateur.class,idUser);
		u.assignVente(v);		
	}
	
	/**
	 * Retourne la liste de toutes les utilisateurs
	 */
	@SuppressWarnings("unchecked")
	public List<Utilisateur> getAllUtilisateurs() 
	{
		Query query = em.createQuery( "SELECT v FROM Vente v ");
		// Get utilisateurs
		List<Utilisateur> utilisateurs = query.getResultList();		
		return utilisateurs;
	}
	
	public void mergeUtilisateur(Utilisateur u)
	{
		em.merge(u);
	}
}